import time

import win32api
import win32con
import win32gui
from pynput.keyboard import Key, Controller

def find_win_by_class_and_title(className,title):
    # 第一个参数为classname，第二个参数为title, 这两个参数可以通过spy++进行查找获取
    hwnd = win32gui.FindWindow('WeWorkWindow', '企业微信')
    # 显示窗口，若不显示可能无法将窗口放到最前
    win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
    # 将窗口放到最前
    win32gui.SetForegroundWindow(hwnd)




# 获取根据父窗口获取子窗口
def get_child_win(parent):
    #获取子窗口
    hwndChildList = []
    win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd),  hwndChildList)
    #获取某个句柄的类名和标题
    title = win32gui.GetWindowText(parent)
    clsname = win32gui.GetClassName(parent)
    print(title,clsname)
    for child in hwndChildList:
        #获取某个句柄的类名和标题
        title = win32gui.GetWindowText(child)
        clsname = win32gui.GetClassName(child)
        print(title,clsname)


'''
操作企业微信窗口，并去添加好友

根据窗口名称遍历所有句柄获取指定窗口
以下为操作企业微信添加好友的一些步骤案例，并不完全
'''
def get_workwx_and_go_to_add_user():
    targetTitle = "企业微信";
    hWndList = []
    # 获取所有的窗口，并将对应的实例放到list中
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    # 遍历所有的获取到聚句柄实例，并获取classname 以及title，如果包含目标窗口名称上了，则说明查找到了对应的窗口（感觉这种方法可能不是太严谨）
    for hwnd in hWndList:
        # 获取class,和 title
        clsname = win32gui.GetClassName(hwnd)
        title = win32gui.GetWindowText(hwnd)
        print(title,clsname)
        # 判断是否包含目标窗口名称，如果包含则find函数的结果返回值为找到的个数，否则返回-1
        if (title.find(targetTitle) >= 0):
            # 获取窗口位置以及大小，返回值是一个数组，包含四个元素，分别是左上x坐标 左上y坐标，右下x坐标，右下y坐标
            rect = win32gui.GetWindowRect(hwnd)
            x = rect[0]
            y = rect[1]
            w = rect[2] - x
            h = rect[3] - y
            print("Window %s:" % win32gui.GetWindowText(hwnd))
            print("\tLocation: (%d, %d)" % (x, y))
            print("\t    Size: (%d, %d)" % (w, h))
            #调整目标窗口到坐标(600,300),大小设置为(600,600)
            #win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 600,300,600,600, win32con.SWP_SHOWWINDOW)
            # 获取鼠标的当前位置
            #pos = win32api.GetCursorPos(hwnd)
            #print(pos[0],pos[1])

            # 移动鼠标到企业微信窗口的通讯录菜单，并点击
            win32api.SetCursorPos([x+30, y+150])
            # 模拟鼠标左键按下。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
            #time.sleep(1)
            # 模拟鼠标左键放开。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)

            # 上方的左键按下松开操作，可以简化为这一句代码
            #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )


            # 移动鼠标到企业微信窗口的通讯录--》新的客户，并点击
            win32api.SetCursorPos([x+100, y+100])
            # 模拟鼠标左键按下。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
            #time.sleep(1)
            # 模拟鼠标左键放开。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)


            # 移动鼠标到企业微信窗口的通讯录--》新的客户--》添加，并点击
            win32api.SetCursorPos([x+w-50, y+50])
            # 模拟鼠标左键按下。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
            #time.sleep(1)
            # 模拟鼠标左键放开。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)




'''
点击添加之后弹出添加客户的窗口，以下方法为操作该窗口的方法
'''
def operate_add_user_win():
    targetTitle = "添加客户"
    hWndList = []
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    for hwnd in hWndList:
        clsname = win32gui.GetClassName(hwnd)
        title = win32gui.GetWindowText(hwnd)
        print(clsname,title)
        if (title.find(targetTitle) >= 0):
            # 获取窗口位置以及大小
            rect = win32gui.GetWindowRect(hwnd)
            x = rect[0]
            y = rect[1]
            w = rect[2] - x
            h = rect[3] - y
            print("Window %s:" % win32gui.GetWindowText(hwnd))
            print("\tLocation: (%d, %d)" % (x, y))
            print("\t    Size: (%d, %d)" % (w, h))

            #定位到输入框，并点击使得输入框获取焦点
            win32api.SetCursorPos([x+100, y+90])
            # 模拟鼠标左键按下。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
            #time.sleep(1)
            # 模拟鼠标左键放开。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)

            # 键盘时间，直接输入字符串
            keyboard = Controller()
            keyboard.type('13625655981')

            # 回车
            keyboard.press(Key.enter)
            keyboard.release(Key.enter)

            # 睡眠一会等待查询结果
            time.sleep(2)

            # 判断是否出现该用户不存在的窗口，如果出现则说明用户不存在
            isExist = get_no_user_tip_win("该用户不存在")
            if(isExist is True):
                print("该用户不存在")
            else:
                print("用户存在，开始添加好友")
                # 将鼠标移动到添加按钮，并点击
                win32api.SetCursorPos([x+316, y+190])
                # 模拟鼠标左键按下。
                win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
                #time.sleep(1)
                # 模拟鼠标左键放开。
                win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)



'''判断是否出现了指定窗口，如果出现则返回True,如果没有则返回False'''
def get_no_user_tip_win(title):
    hWndList = []
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    for hwnd in hWndList:
        clsname = win32gui.GetClassName(hwnd)
        title = win32gui.GetWindowText(hwnd)
        if (title.find(title) > 0):
            return True
        else:
            return False


'''在点击添加按钮之后会弹出发送添加邀请的窗口，这里操作这个窗口完成发送添加申请,注意，这个发送添加邀请的窗口的title为请输入认证信息'''
def send_add_request(targetTitle):
    targetTitle="请输认证信息"
    hWndList = []
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    for hwnd in hWndList:
        clsname = win32gui.GetClassName(hwnd)
        title = win32gui.GetWindowText(hwnd)
        if (title.find(targetTitle) >= 0):
            # 获取窗口位置以及大小
            rect = win32gui.GetWindowRect(hwnd)
            x = rect[0]
            y = rect[1]
            w = rect[2] - x
            h = rect[3] - y
            print("Window %s:" % win32gui.GetWindowText(hwnd))
            print("\tLocation: (%d, %d)" % (x, y))
            print("\t    Size: (%d, %d)" % (w, h))
            win32api.SetCursorPos([x, y])
            # 模拟鼠标左键按下。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
            #time.sleep(1)
            # 模拟鼠标左键放开。
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP13625655981, 0, 0)



if __name__=='__main__':
    get_workwx_and_go_to_add_user()
    time.sleep(1)
    operate_add_user_win("添加客户")
    time.sleep(1)
    send_add_request("发送添加邀请")